Despliegue de los resultados Medellín

In [1]:
# Importar paquetes
import matplotlib.pyplot as plt
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from fbprophet import Prophet
import warnings
warnings.filterwarnings('ignore')
import seaborn as sns
!pip install plotly
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import datetime as dt
from datetime import timedelta
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score,silhouette_samples
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.preprocessing import PolynomialFeatures
import statsmodels.api as sm
from statsmodels.tsa.api import Holt,SimpleExpSmoothing,ExponentialSmoothing
from statsmodels.tsa.stattools import adfuller
std=StandardScaler()
from pmdarima.arima import auto_arima
pd.set_option('display.float_format', lambda x: '%.6f' % x)
Requirement already satisfied: plotly in c:\users\itco10096\.conda\envs\apc\lib\site-packages (4.9.0)
Requirement already satisfied: retrying>=1.3.3 in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.3.3)
Requirement already satisfied: six in c:\users\itco10096\.conda\envs\apc\lib\site-packages (from plotly) (1.15.0)
In [2]:
dfCovid = pd.read_csv('https://www.datos.gov.co/api/views/gt2j-8ykr/rows.csv')
In [3]:
dfCovid.head(10)
Out[3]:
ID de caso Fecha de notificación Código DIVIPOLA Ciudad de ubicación Departamento o Distrito atención Edad Sexo Tipo Estado ... FIS Fecha de muerte Fecha diagnostico Fecha recuperado fecha reporte web Tipo recuperación Codigo departamento Codigo pais Pertenencia etnica Nombre grupo etnico
0 1 2020-03-02T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 19 F Importado Leve ... 2020-02-27T00:00:00.000 NaN 2020-03-06T00:00:00.000 2020-03-13T00:00:00.000 2020-03-06T00:00:00.000 PCR 11 380.000000 Otro NaN
1 2 2020-03-06T00:00:00.000 76111 Guadalajara de Buga Valle del Cauca Recuperado 34 M Importado Leve ... 2020-03-04T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-19T00:00:00.000 2020-03-09T00:00:00.000 PCR 76 724.000000 Otro NaN
2 3 2020-03-07T00:00:00.000 5001 Medellín Antioquia Recuperado 50 F Importado Leve ... 2020-02-29T00:00:00.000 NaN 2020-03-09T00:00:00.000 2020-03-15T00:00:00.000 2020-03-09T00:00:00.000 PCR 5 724.000000 Otro NaN
3 4 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 55 M Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
4 5 2020-03-09T00:00:00.000 5001 Medellín Antioquia Recuperado 25 M Relacionado Leve ... 2020-03-08T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
5 6 2020-03-10T00:00:00.000 5360 Itagüí Antioquia Recuperado 27 F Relacionado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-26T00:00:00.000 2020-03-11T00:00:00.000 PCR 5 nan Otro NaN
6 7 2020-03-08T00:00:00.000 13001 Cartagena de Indias Cartagena D.T. y C. Recuperado 85 F Importado Leve ... 2020-03-02T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-17T00:00:00.000 2020-03-11T00:00:00.000 PCR 13 840.000000 Otro NaN
7 8 2020-03-09T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 22 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-21T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
8 9 2020-03-08T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 28 F Importado Leve ... 2020-03-07T00:00:00.000 NaN 2020-03-11T00:00:00.000 2020-03-23T00:00:00.000 2020-03-11T00:00:00.000 PCR 11 724.000000 Otro NaN
9 10 2020-03-12T00:00:00.000 11001 Bogotá D.C. Bogotá D.C. Recuperado 36 F Importado Leve ... 2020-03-06T00:00:00.000 NaN 2020-03-12T00:00:00.000 2020-03-21T00:00:00.000 2020-03-12T00:00:00.000 PCR 11 724.000000 Otro NaN

10 rows × 21 columns

In [4]:
# Modificar el tipo de datos para las variables de fechas.
dfCovid['Fecha de notificación']= pd.to_datetime(dfCovid['Fecha de notificación'])
dfCovid[ 'Fecha de muerte']= pd.to_datetime(dfCovid['Fecha de muerte'])
dfCovid['Fecha diagnostico']= pd.to_datetime(dfCovid['Fecha diagnostico'])
dfCovid['Fecha recuperado']= pd.to_datetime(dfCovid['Fecha recuperado'])
dfCovid['fecha reporte web']= pd.to_datetime(dfCovid['fecha reporte web'])
In [5]:
# Limpieza de los resultados para el atributo atención.
dfCovid['atención'].unique()
dfCovid['atención']= dfCovid['atención'].replace({'CASA':'Casa'})
dfCovid['atención']= dfCovid['atención'].fillna('No especifica')
In [6]:
fechas= sorted(pd.concat([dfCovid['Fecha de notificación'],dfCovid['Fecha diagnostico'],dfCovid['Fecha de muerte'],dfCovid['Fecha recuperado'],dfCovid['fecha reporte web']]).unique())
fechas=np.arange(min(fechas),max(fechas),np.timedelta64(86400000000000,'ns'))
dfCovid_Nuevo=pd.DataFrame({'Fecha':fechas})
dfCovid_Nuevo['Muertos']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Confirmados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo['Recuperados']=np.zeros(len(dfCovid_Nuevo))
dfCovid_Nuevo
Out[6]:
Fecha Muertos Confirmados Recuperados
0 2020-03-02 0.000000 0.000000 0.000000
1 2020-03-03 0.000000 0.000000 0.000000
2 2020-03-04 0.000000 0.000000 0.000000
3 2020-03-05 0.000000 0.000000 0.000000
4 2020-03-06 0.000000 0.000000 0.000000
... ... ... ... ...
182 2020-08-31 0.000000 0.000000 0.000000
183 2020-09-01 0.000000 0.000000 0.000000
184 2020-09-02 0.000000 0.000000 0.000000
185 2020-09-03 0.000000 0.000000 0.000000
186 2020-09-04 0.000000 0.000000 0.000000

187 rows × 4 columns

MEDELLÍN

In [7]:
# Se filtra por la ciudad de interés
nombre='Medellín'
x=dfCovid[dfCovid['Ciudad de ubicación']==nombre].sort_values(by='Fecha de muerte',ascending=False)
x=x[['ID de caso','atención','fecha reporte web','Fecha de muerte','Fecha de notificación','Fecha diagnostico','Fecha recuperado']]
x
Out[7]:
ID de caso atención fecha reporte web Fecha de muerte Fecha de notificación Fecha diagnostico Fecha recuperado
533124 533165 Fallecido 2020-08-23 2020-09-05 2020-08-05 2020-08-20 NaT
367200 367241 Fallecido 2020-08-08 2020-09-05 2020-08-07 2020-08-07 NaT
615519 615560 Fallecido 2020-09-01 2020-09-05 2020-08-29 2020-08-31 NaT
507968 508009 Fallecido 2020-08-20 2020-09-05 2020-08-15 2020-08-20 NaT
572038 572079 Fallecido 2020-08-26 2020-09-04 2020-08-11 2020-08-22 NaT
... ... ... ... ... ... ... ...
658445 658486 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
658447 658488 Casa 2020-09-05 NaT 2020-08-24 2020-09-04 NaT
658450 658491 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT
658451 658492 Casa 2020-09-05 NaT 2020-08-22 2020-09-02 NaT
658453 658494 Casa 2020-09-05 NaT 2020-08-23 2020-09-03 NaT

50942 rows × 7 columns

In [8]:
# Se construye el Data Set Covid-19

#Conteo de muertos
m=x[x['atención']=='Fallecido'].groupby('Fecha de muerte').count()
m=pd.DataFrame({'Fecha':m.index.values,'Muertos':[n for n in m.values[:,0]]})

#Conteo de Confirmados
c=x.groupby('Fecha de notificación').count()
c=pd.DataFrame({'Fecha':c.index.values,'Confirmados':[n for n in c.values[:,0]]})

#Conteo Recuperados
r=x.groupby('Fecha recuperado').count()
r=pd.DataFrame({'Fecha':r.index.values,'Recuperados':[n for n in r.values[:,0]]})

df_Nuevo=pd.concat([dfCovid_Nuevo,c,m,r])
df_Nuevo.sort_values(by='Fecha',ascending=True)
df_Nuevo=df_Nuevo.groupby('Fecha').sum().sort_values(by='Fecha',ascending=True)

def acum(df,Col):
  m=df[Col].values
  d=0
  L=[]
  for n in m:
    d=d+n
    L.append(d)
  return L

df_Nuevo['Acum_muertos']=acum(df_Nuevo,'Muertos')
df_Nuevo['Acum_confirmados']=acum(df_Nuevo,'Confirmados')
df_Nuevo['Acum_Recuperados']=acum(df_Nuevo,'Recuperados')
df_Nuevo['Acum_Activos']=df_Nuevo['Acum_confirmados']-df_Nuevo['Acum_Recuperados']-df_Nuevo['Acum_muertos']
df_Nuevo
Out[8]:
Muertos Confirmados Recuperados Acum_muertos Acum_confirmados Acum_Recuperados Acum_Activos
Fecha
2020-03-02 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-03 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-04 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-05 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
2020-03-06 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
... ... ... ... ... ... ... ...
2020-09-01 13.000000 268.000000 1210.000000 988.000000 50414.000000 36515.000000 12911.000000
2020-09-02 12.000000 240.000000 899.000000 1000.000000 50654.000000 37414.000000 12240.000000
2020-09-03 10.000000 197.000000 595.000000 1010.000000 50851.000000 38009.000000 11832.000000
2020-09-04 11.000000 91.000000 1495.000000 1021.000000 50942.000000 39504.000000 10417.000000
2020-09-05 4.000000 0.000000 690.000000 1025.000000 50942.000000 40194.000000 9723.000000

188 rows × 7 columns

ANÁLISIS EXPLORATORIO DE DATOS

In [9]:
print("Estructura del dataset: ",df_Nuevo.shape)
print("Variables con valores nulos",df_Nuevo.isnull().sum())
print("Tipo de variables del dataset",df_Nuevo.dtypes)
Estructura del dataset:  (188, 7)
Variables con valores nulos Muertos             0
Confirmados         0
Recuperados         0
Acum_muertos        0
Acum_confirmados    0
Acum_Recuperados    0
Acum_Activos        0
dtype: int64
Tipo de variables del dataset Muertos             float64
Confirmados         float64
Recuperados         float64
Acum_muertos        float64
Acum_confirmados    float64
Acum_Recuperados    float64
Acum_Activos        float64
dtype: object
In [10]:
print("Información Básica")
df_Nuevo.iloc(0)[-1]
Información Básica
Out[10]:
Muertos                4.000000
Confirmados            0.000000
Recuperados          690.000000
Acum_muertos        1025.000000
Acum_confirmados   50942.000000
Acum_Recuperados   40194.000000
Acum_Activos        9723.000000
Name: 2020-09-05 00:00:00, dtype: float64
In [11]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Activos"])
fig.update_layout(title="Distribución del número de casos activos en Medellín ",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Medellín",)
fig.show()
In [12]:
fig=px.bar(x=df_Nuevo.index,y=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"])
fig.update_layout(title="Distribución del número de casos cerrados en Medellín",
                  xaxis_title="Fecha",yaxis_title="Número de casos en Medellín")
fig.show()
In [13]:
df_Nuevo["WeekOfYear"]=df_Nuevo.index.weekofyear

week_num=[]
weekwise_confirmed=[]
weekwise_recovered=[]
weekwise_deaths=[]
weekwise_active=[]
w=1
for i in list(df_Nuevo["WeekOfYear"].unique()):
    weekwise_confirmed.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_confirmados"].iloc[-1])
    weekwise_recovered.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Recuperados"].iloc[-1])
    weekwise_deaths.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_muertos"].iloc[-1])
    weekwise_active.append(df_Nuevo[df_Nuevo["WeekOfYear"]==i]["Acum_Activos"].iloc[-1])
    week_num.append(w)
    w=w+1

fig=go.Figure()
fig.add_trace(go.Scatter(x=week_num, y=weekwise_confirmed,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos confirmados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_recovered,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos recuperados'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_deaths,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos de muerte'))
fig.add_trace(go.Scatter(x=week_num, y=weekwise_active,
                    mode='lines+markers',
                    name='Crecimiento semanal de los casos Activos'))
fig.update_layout(title="Crecimiento semanal de diferentes tipos de casos en Medellín",
                 xaxis_title="Número de semanas",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [14]:
fig, (ax1,ax2) = plt.subplots(1, 2,figsize=(15,5))
sns.barplot(x=week_num,y=pd.Series(weekwise_confirmed).diff().fillna(0),ax=ax1)
sns.barplot(x=week_num,y=pd.Series(weekwise_deaths).diff().fillna(0),ax=ax2)
ax1.set_xlabel("Número de semanas")
ax2.set_xlabel("Número de semanas")
ax1.set_ylabel("Número de casos confirmados")
ax2.set_ylabel("Número de casos de fallecidos")
ax1.set_title("Aumento semanal del número de casos confirmados en Medellín")
ax2.set_title("Aumento semanal del número de casos de muerte en Medellín")
Out[14]:
Text(0.5, 1.0, 'Aumento semanal del número de casos de muerte en Medellín')

Tasa de crecimiento de los casos confirmados, recuperados y de muerte

In [15]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',
                    name='Casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"],
                    mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"],
                    mode='lines+markers',
                    name='Casos de muertes'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"],
                    mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Crecimiento de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()

Análisis de la tasa de moralidad y recuperación

In [16]:
df_Nuevo["Tasa de mortalidad"]=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Tasa de Recuperacion"]=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100
df_Nuevo["Casos Cerrados"]=df_Nuevo["Acum_Recuperados"]+df_Nuevo["Acum_muertos"]

print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].mean())
print("Tasa de mortalidad media",df_Nuevo["Tasa de mortalidad"].median())
print("Promedio de la tasa de recuperación",df_Nuevo["Tasa de Recuperacion"].mean())
print("Tasa de recuperación media",df_Nuevo["Tasa de Recuperacion"].median())

#Plotting Mortality and Recovery Rate 
fig = make_subplots(rows=2, cols=1,
                   subplot_titles=("Tasa de Recuperacion", "Tasa de mortalidad"))
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de Recuperacion"),
    row=1, col=1
)
fig.add_trace(
    go.Scatter(x=df_Nuevo.index, y=(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_confirmados"])*100,name="Tasa de mortalidad"),
    row=2, col=1
)
fig.update_layout(height=1000,legend=dict(x=-0.1,y=1.2,traceorder="normal"))
fig.update_xaxes(title_text="Fecha", row=1, col=1)
fig.update_yaxes(title_text="Tasa de Recuperacion en Medellín", row=1, col=1)
fig.update_xaxes(title_text="Fecha", row=1, col=2)
fig.update_yaxes(title_text="Tasa de mortalidad en Medellín", row=1, col=2)
fig.show()
Tasa de mortalidad media 0.8032885231016178
Tasa de mortalidad media 0.7137883008356546
Promedio de la tasa de recuperación 35.38398651748146
Tasa de recuperación media 35.256410256410255
In [17]:
print("Aumento medio del número de casos confirmados cada día en Medellín: ",np.round(df_Nuevo["Acum_confirmados"].diff().fillna(0).mean()))
print("Aumento medio del número de casos recuperados cada día en Medellín: ",np.round(df_Nuevo["Acum_Recuperados"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de muerte cada día en Medellín: ",np.round(df_Nuevo["Acum_muertos"].diff().fillna(0).mean()))
print("Aumento promedio del número de casos de activos cada día en Medellín: ",np.round(df_Nuevo["Acum_Activos"].diff().fillna(0).mean()))

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().fillna(0),mode='lines+markers',
                    name='Casos de recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().fillna(0),mode='lines+markers',
                    name='Casos de Muerte'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().fillna(0),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Aumento diario de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
Aumento medio del número de casos confirmados cada día en Medellín:  271.0
Aumento medio del número de casos recuperados cada día en Medellín:  214.0
Aumento promedio del número de casos de muerte cada día en Medellín:  5.0
Aumento promedio del número de casos de activos cada día en Medellín:  52.0
In [18]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Fallecidos'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Activos"].diff().rolling(window=7).mean(),mode='lines+markers',
                    name='Casos Activos'))
fig.update_layout(title="Media móvil por cada 7 días de los casos confirmados, recuperados y de muerte en Medellín",
                 xaxis_title="Fecha",yaxis_title="Número de casos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [19]:
print("Promedio de crecimiento medio del número de casos confirmados en Medellín: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos confirmados en Medellín: ",(df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift()).median())
print("Promedio de crecimiento medio del número de casos recuperados en Medellín: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).mean())
print("Mediana de crecimiento medio del número de casos recuperados en Medellín: ",(df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift()).median())
print("Promedio de crecimiento medio del número de casos de muerte en Medellín: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).mean())
print("Mediana de crecimiento medio del número de casos de muerte en Medellín: ",(df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift()).median())

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"]/df_Nuevo["Acum_confirmados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos confirmados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_Recuperados"]/df_Nuevo["Acum_Recuperados"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos recuperados'))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_muertos"]/df_Nuevo["Acum_muertos"].shift(),
                    mode='lines',
                    name='Factor de crecimiento de los casos de muerte'))
fig.update_layout(title="Factor de crecimiento en función de la fecha de los diferentes tipos de casos en Medellín",
                 xaxis_title="Fecha",yaxis_title="Factor de crecimiento",
                 legend=dict(x=0,y=-0.4,traceorder="normal"))
fig.show()
Promedio de crecimiento medio del número de casos confirmados en Medellín:  inf
Mediana de crecimiento medio del número de casos confirmados en Medellín:  1.0341655716162943
Promedio de crecimiento medio del número de casos recuperados en Medellín:  inf
Mediana de crecimiento medio del número de casos recuperados en Medellín:  1.0406871609403254
Promedio de crecimiento medio del número de casos de muerte en Medellín:  inf
Mediana de crecimiento medio del número de casos de muerte en Medellín:  1.0115184190483826

MODELOS DE PREDICCIÓN MEDELLÍN

CASOS CONFIRMADOS

Modelo de regresión lineal para la predicción

In [20]:
df_Nuevo["Fecha"]=df_Nuevo.index-df_Nuevo.index[0]
df_Nuevo["Fecha"]=df_Nuevo["Fecha"].dt.days
In [21]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
model_scores=[]
In [22]:
lin_reg=LinearRegression(normalize=True)
In [23]:
lin_reg.fit(np.array(train_ml["Fecha"]).reshape(-1,1),np.array(train_ml["Acum_confirmados"]).reshape(-1,1))
Out[23]:
LinearRegression(normalize=True)
In [24]:
prediction_valid_linreg=lin_reg.predict(np.array(valid_ml["Fecha"]).reshape(-1,1))
In [25]:
model_scores.append(np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_linreg)))
print("Error del cuadrado medio de la raíz para la regresión lineal en Medellín: ",np.sqrt(mean_squared_error(valid_ml["Confirmados"],prediction_valid_linreg)))
Error del cuadrado medio de la raíz para la regresión lineal en Medellín:  30291.14169490556
In [26]:
plt.figure(figsize=(11,6))
prediction_linreg=lin_reg.predict(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
linreg_output=[]
for i in range(prediction_linreg.shape[0]):
    linreg_output.append(prediction_linreg[i][0])

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=linreg_output,
                    mode='lines',name="Regresión lineal de mejor ajuste",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados Predicción de regresión lineal",
                 xaxis_title="Fecha",yaxis_title="Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>

Regresión polinómica para la prediccción

In [27]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
In [28]:
poly = PolynomialFeatures(degree = 4) 
In [29]:
train_poly=poly.fit_transform(np.array(train_ml["Fecha"]).reshape(-1,1))
valid_poly=poly.fit_transform(np.array(valid_ml["Fecha"]).reshape(-1,1))
y=train_ml["Acum_confirmados"]
In [30]:
linreg=LinearRegression(normalize=True)
linreg.fit(train_poly,y)
Out[30]:
LinearRegression(normalize=True)
In [31]:
prediction_poly=linreg.predict(valid_poly)
rmse_poly=np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_poly))
model_scores.append(rmse_poly)
print("Error de la media cuadrática de la raíz para la regresión polinómica para Medellín: ",rmse_poly)
Error de la media cuadrática de la raíz para la regresión polinómica para Medellín:  10308.96929198265
In [32]:
comp_data=poly.fit_transform(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
plt.figure(figsize=(11,6))
predictions_poly=linreg.predict(comp_data)

fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=predictions_poly,
                    mode='lines',name="El mejor ajuste de la regresión polinómica",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados Predicción de regresión polinómica en Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",
                 legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>
In [33]:
new_prediction_poly=[]
for i in range(1,18):
    new_date_poly=poly.fit_transform(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))
    new_prediction_poly.append(linreg.predict(new_date_poly)[0])

Modelo de Máquina de Vectores de Soporte

In [34]:
train_ml=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid_ml=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
In [35]:
#Iniciando el modelo de SVR
svm=SVR(C=1,degree=2,kernel='poly',epsilon=0.01)
In [36]:
#Modelo de ajuste en los datos de entrenamiento
svm.fit(np.array(train_ml["Fecha"]).reshape(-1,1),np.array(train_ml["Acum_confirmados"]).reshape(-1,1))
Out[36]:
SVR(C=1, degree=2, epsilon=0.01, kernel='poly')
In [37]:
prediction_valid_svm=svm.predict(np.array(valid_ml["Fecha"]).reshape(-1,1))
In [38]:
model_scores.append(np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_svm)))
print("Error del cuadrado medio de la raíz para SVM en Medellín: ",np.sqrt(mean_squared_error(valid_ml["Acum_confirmados"],prediction_valid_svm)))
Error del cuadrado medio de la raíz para SVM en Medellín:  45623.167452216665
In [39]:
plt.figure(figsize=(11,6))
prediction_svm=svm.predict(np.array(df_Nuevo["Fecha"]).reshape(-1,1))
fig=go.Figure()
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=df_Nuevo["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=df_Nuevo.index, y=prediction_svm,
                    mode='lines',name="SVM adecuado",
                    line=dict(color='black', dash='dot')))
fig.update_layout(title="Casos confirmados usando el SVM para Medellín",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
<Figure size 792x432 with 0 Axes>
In [40]:
new_date=[]
new_prediction_lr=[]
new_prediction_svm=[]
for i in range(1,18):
    new_date.append(df_Nuevo.index[-1]+timedelta(days=i))
    new_prediction_lr.append(lin_reg.predict(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))[0][0])
    new_prediction_svm.append(svm.predict(np.array(df_Nuevo["Fecha"].max()+i).reshape(-1,1))[0])
In [41]:
pd.set_option('display.float_format', lambda x: '%.6f' % x)
model_predictions=pd.DataFrame(zip(new_date,new_prediction_lr,new_prediction_poly,new_prediction_svm),
                               columns=["Fecha","Regresión Lineal","Regresión Polinomial","SVM"])
model_predictions.head()
Out[41]:
Fecha Regresión Lineal Regresión Polinomial SVM
0 2020-09-06 31496.831554 66484.671137 5051.898467
1 2020-09-07 31723.996454 67884.111332 5105.906726
2 2020-09-08 31951.161354 69298.682551 5160.201500
3 2020-09-09 32178.326254 70728.354002 5214.782790
4 2020-09-10 32405.491154 72173.092863 5269.650596

Método Holt

In [42]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [43]:
holt=Holt(np.asarray(model_train["Acum_confirmados"])).fit(smoothing_level=0.2, smoothing_slope=1.8,optimized=False)
In [44]:
y_pred["Holt"]=holt.forecast(len(valid))
model_scores.append(np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["Holt"])))
print("Error del cuadrado medio del HOLT: ",np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["Holt"])))
Error del cuadrado medio del HOLT:  276.84550059432
In [45]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Train Data for Confirmed Cases"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["Holt"],
                    mode='lines+markers',name="Predicción de casos Confirmados",))
fig.update_layout(title="Casos Confirmados usando el modelo de Predicción HOLT",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [46]:
holt_new_date=[]
holt_new_prediction=[]
for i in range(1,18):
    holt_new_date.append(df_Nuevo.index[-1]+timedelta(days=i))
    holt_new_prediction.append(holt.forecast((len(valid)+i))[-1])

model_predictions["Modelo de predicción HOLT"]=holt_new_prediction
model_predictions.head()
Out[46]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT
0 2020-09-06 31496.831554 66484.671137 5051.898467 50761.478654
1 2020-09-07 31723.996454 67884.111332 5105.906726 50866.010413
2 2020-09-08 31951.161354 69298.682551 5160.201500 50970.542172
3 2020-09-09 32178.326254 70728.354002 5214.782790 51075.073931
4 2020-09-10 32405.491154 72173.092863 5269.650596 51179.605690

Modelo MA (Usando Auto ARIMA)

In [47]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [48]:
model_ma= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=0,start_q=0,max_p=0,max_q=5,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_ma.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2199.895, Time=0.03 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2163.002, Time=0.16 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2164.979, Time=0.23 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2163.202, Time=0.31 sec
 ARIMA(0,2,4)(0,0,0)[0] intercept   : AIC=2162.116, Time=0.27 sec
 ARIMA(0,2,5)(0,0,0)[0] intercept   : AIC=2163.479, Time=0.44 sec
Total fit time: 1.466 seconds
Out[48]:
ARIMA(order=(0, 2, 4), scoring_args={}, suppress_warnings=True)
In [49]:
prediction_ma=model_ma.predict(len(valid))
y_pred["MA Model Prediction"]=prediction_ma
In [50]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_ma)))
print("Error Cuadrático Medio Modelo MA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_ma)))
Error Cuadrático Medio Modelo MA:  360.9967462565043
In [51]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos Confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de Validación para casos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["MA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados para el modelo MA",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [52]:
MA_model_new_prediction=[]
for i in range(1,18):
    MA_model_new_prediction.append(model_ma.predict(len(valid)+i)[-1])
model_predictions["Modelo MA"]=MA_model_new_prediction
model_predictions.head()
Out[52]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA
0 2020-09-06 31496.831554 66484.671137 5051.898467 50761.478654 50616.257334
1 2020-09-07 31723.996454 67884.111332 5105.906726 50866.010413 50717.514720
2 2020-09-08 31951.161354 69298.682551 5160.201500 50970.542172 50819.327895
3 2020-09-09 32178.326254 70728.354002 5214.782790 51075.073931 50921.696859
4 2020-09-10 32405.491154 72173.092863 5269.650596 51179.605690 51024.621613

Modelo ARIMA (Usando Auto-ARIMA)

In [53]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [54]:
model_arima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_confirmados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2199.895, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2163.002, Time=0.19 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2164.979, Time=0.27 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2163.202, Time=0.36 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2174.794, Time=0.09 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2164.988, Time=0.26 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2162.777, Time=0.37 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2162.230, Time=0.62 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2164.060, Time=0.14 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2164.690, Time=0.25 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2160.858, Time=0.45 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2164.679, Time=0.58 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2163.944, Time=0.20 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2165.832, Time=0.35 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2162.126, Time=0.60 sec
Total fit time: 4.767 seconds
Out[54]:
ARIMA(order=(2, 2, 2), scoring_args={}, suppress_warnings=True)
In [55]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [56]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_confirmados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  450.2999484880463
In [57]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para datos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos confirmados",))
fig.update_layout(title="Predicción de casos confirmados con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [58]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
model_predictions["ARIMA Model Prediction"]=ARIMA_model_new_prediction
model_predictions.head()
Out[58]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction
0 2020-09-06 31496.831554 66484.671137 5051.898467 50761.478654 50616.257334 50446.973554
1 2020-09-07 31723.996454 67884.111332 5105.906726 50866.010413 50717.514720 50534.344107
2 2020-09-08 31951.161354 69298.682551 5160.201500 50970.542172 50819.327895 50621.059940
3 2020-09-09 32178.326254 70728.354002 5214.782790 51075.073931 50921.696859 50707.293283
4 2020-09-10 32405.491154 72173.092863 5269.650596 51179.605690 51024.621613 50793.530487

Modelo SARIMA (Usanto Auto ARIMA)

In [59]:
model_sarima= auto_arima(model_train["Acum_confirmados"],trace=True, error_action='ignore', 
                         start_p=0,start_q=0,max_p=2,max_q=2,m=7,
                   suppress_warnings=True,stepwise=True,seasonal=True)
model_sarima.fit(model_train["Acum_confirmados"])
Performing stepwise search to minimize aic
 ARIMA(0,2,0)(1,0,1)[7]             : AIC=2162.730, Time=0.28 sec
 ARIMA(0,2,0)(0,0,0)[7]             : AIC=2197.926, Time=0.02 sec
 ARIMA(1,2,0)(1,0,0)[7]             : AIC=2148.848, Time=0.12 sec
 ARIMA(0,2,1)(0,0,1)[7]             : AIC=2149.458, Time=0.18 sec
 ARIMA(1,2,0)(0,0,0)[7]             : AIC=2172.867, Time=0.06 sec
 ARIMA(1,2,0)(2,0,0)[7]             : AIC=2139.494, Time=0.30 sec
 ARIMA(1,2,0)(2,0,1)[7]             : AIC=2141.494, Time=0.50 sec
 ARIMA(1,2,0)(1,0,1)[7]             : AIC=2142.350, Time=0.31 sec
 ARIMA(0,2,0)(2,0,0)[7]             : AIC=2160.153, Time=0.17 sec
 ARIMA(2,2,0)(2,0,0)[7]             : AIC=2133.353, Time=0.37 sec
 ARIMA(2,2,0)(1,0,0)[7]             : AIC=2144.578, Time=0.17 sec
 ARIMA(2,2,0)(2,0,1)[7]             : AIC=2135.207, Time=0.62 sec
 ARIMA(2,2,0)(1,0,1)[7]             : AIC=2136.599, Time=0.36 sec
 ARIMA(2,2,1)(2,0,0)[7]             : AIC=2134.480, Time=0.43 sec
 ARIMA(1,2,1)(2,0,0)[7]             : AIC=2133.461, Time=0.33 sec
 ARIMA(2,2,0)(2,0,0)[7] intercept   : AIC=2135.321, Time=0.81 sec

Best model:  ARIMA(2,2,0)(2,0,0)[7]          
Total fit time: 5.098 seconds
Out[59]:
ARIMA(order=(2, 2, 0), scoring_args={}, seasonal_order=(2, 0, 0, 7),
      suppress_warnings=True, with_intercept=False)
In [60]:
prediction_sarima=model_sarima.predict(len(valid))
y_pred["SARIMA Model Prediction"]=prediction_sarima
In [61]:
model_scores.append(np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["SARIMA Model Prediction"])))
print("Error Cuadrático Medio Modelo SARIMA: ",np.sqrt(mean_squared_error(y_pred["Acum_confirmados"],y_pred["SARIMA Model Prediction"])))
Error Cuadrático Medio Modelo SARIMA:  131.76582293049398
In [62]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_confirmados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos confirmados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_confirmados"],
                    mode='lines+markers',name="Datos de validación para casos confirmados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["SARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción para casos confirmados",))
fig.update_layout(title="Predicción de datos confirmados modelo SARIMA en Medellín",
                 xaxis_title="Fecha",yaxis_title="Casos Confirmados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [63]:
SARIMA_model_new_prediction=[]
for i in range(1,18):
    SARIMA_model_new_prediction.append(model_sarima.predict(len(valid)+i)[-1])
model_predictions["Modelo SARIMA"]=SARIMA_model_new_prediction
model_predictions.head()
Out[63]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction Modelo SARIMA
0 2020-09-06 31496.831554 66484.671137 5051.898467 50761.478654 50616.257334 50446.973554 51359.403083
1 2020-09-07 31723.996454 67884.111332 5105.906726 50866.010413 50717.514720 50534.344107 51619.225833
2 2020-09-08 31951.161354 69298.682551 5160.201500 50970.542172 50819.327895 50621.059940 51670.060605
3 2020-09-09 32178.326254 70728.354002 5214.782790 51075.073931 50921.696859 50707.293283 51671.091291
4 2020-09-10 32405.491154 72173.092863 5269.650596 51179.605690 51024.621613 50793.530487 51667.194259

Modelo Prophet

In [64]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_confirmados"])),columns=['ds','y'])
In [65]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[65]:
<fbprophet.forecaster.Prophet at 0x1fd3b88a3c8>
In [66]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [67]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [68]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_confirmados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  646.6635122054975
In [69]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [70]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)
In [71]:
model_names=["Linear Regression","Polynomial Regression","Support Vector Machine Regressor","Holt's Linear",
            "Auto Regressive Model (AR)","Moving Average Model (MA)","ARIMA Model","SARIMA Model","Facebook's Prophet Model"]
model_summary=pd.DataFrame(zip(model_names,model_scores),columns=["Model Name","Root Mean Squared Error"]).sort_values(["Root Mean Squared Error"])
model_summary
Out[71]:
Model Name Root Mean Squared Error
6 ARIMA Model 131.765823
3 Holt's Linear 276.845501
4 Auto Regressive Model (AR) 360.996746
5 Moving Average Model (MA) 450.299948
7 SARIMA Model 646.663512
1 Polynomial Regression 10308.969292
0 Linear Regression 19960.784500
2 Support Vector Machine Regressor 45623.167452
In [72]:
model_predictions["Prophet's Prediction"]=list(confirmed_forecast["yhat"].tail(17))
model_predictions["Prophet's Upper Bound"]=list(confirmed_forecast["yhat_upper"].tail(17))
model_predictions.head()
Out[72]:
Fecha Regresión Lineal Regresión Polinomial SVM Modelo de predicción HOLT Modelo MA ARIMA Model Prediction Modelo SARIMA Prophet's Prediction Prophet's Upper Bound
0 2020-09-06 31496.831554 66484.671137 5051.898467 50761.478654 50616.257334 50446.973554 51359.403083 55638.330090 56377.025734
1 2020-09-07 31723.996454 67884.111332 5105.906726 50866.010413 50717.514720 50534.344107 51619.225833 56386.729099 57202.657254
2 2020-09-08 31951.161354 69298.682551 5160.201500 50970.542172 50819.327895 50621.059940 51670.060605 57113.115320 57869.678588
3 2020-09-09 32178.326254 70728.354002 5214.782790 51075.073931 50921.696859 50707.293283 51671.091291 57811.116398 58620.282722
4 2020-09-10 32405.491154 72173.092863 5269.650596 51179.605690 51024.621613 50793.530487 51667.194259 58521.403669 59299.843073

CASOS FALLECIDOS

Modelo ARIMA (Usando Auto-ARIMA)

In [73]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [74]:
model_arima= auto_arima(model_train["Acum_muertos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_muertos"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=1004.236, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=901.361, Time=0.11 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=897.963, Time=0.14 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=898.846, Time=0.17 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=928.461, Time=0.05 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=897.392, Time=0.11 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=899.367, Time=0.17 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=900.797, Time=0.29 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=908.234, Time=0.08 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=899.351, Time=0.14 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=901.317, Time=0.40 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=895.391, Time=0.58 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=906.833, Time=0.19 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=900.940, Time=0.26 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=902.872, Time=0.34 sec
Total fit time: 3.078 seconds
Out[74]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [75]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [76]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_muertos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  36.9126710734004
In [77]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_muertos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos fallecidos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_muertos"],
                    mode='lines+markers',name="Datos de validación para datos fallecidos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos fallecidos",))
fig.update_layout(title="Predicción de casos fallecidos con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [78]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [79]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Casos de Muertes","Modelo de Predicción Modelo Arima"]).head()
Out[79]:
Casos de Muertes Modelo de Predicción Modelo Arima
0 2020-09-06 1116.247305
1 2020-09-07 1138.823170
2 2020-09-08 1160.829408
3 2020-09-09 1182.552491
4 2020-09-10 1204.951826

Modelo Prophet

In [80]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_muertos"])),columns=['ds','y'])
In [81]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[81]:
<fbprophet.forecaster.Prophet at 0x1fd3cf6cc88>
In [82]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [83]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [84]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_muertos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  5.775509585637455
In [85]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [86]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS RECUPERADOS

Modelo ARIMA (Usando Auto-ARIMA)

In [87]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [88]:
model_arima= auto_arima(model_train["Acum_Recuperados"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Recuperados"])
 ARIMA(0,2,0)(0,0,0)[0] intercept   : AIC=2217.826, Time=0.02 sec
 ARIMA(0,2,1)(0,0,0)[0] intercept   : AIC=2194.962, Time=0.19 sec
 ARIMA(0,2,2)(0,0,0)[0] intercept   : AIC=2196.640, Time=0.30 sec
 ARIMA(0,2,3)(0,0,0)[0] intercept   : AIC=2198.187, Time=0.33 sec
 ARIMA(1,2,0)(0,0,0)[0] intercept   : AIC=2199.678, Time=0.09 sec
 ARIMA(1,2,1)(0,0,0)[0] intercept   : AIC=2196.587, Time=0.26 sec
 ARIMA(1,2,2)(0,0,0)[0] intercept   : AIC=2198.579, Time=0.37 sec
 ARIMA(1,2,3)(0,0,0)[0] intercept   : AIC=2178.201, Time=0.46 sec
 ARIMA(2,2,0)(0,0,0)[0] intercept   : AIC=2199.808, Time=0.04 sec
 ARIMA(2,2,1)(0,0,0)[0] intercept   : AIC=2198.553, Time=0.27 sec
 ARIMA(2,2,2)(0,0,0)[0] intercept   : AIC=2187.224, Time=0.40 sec
 ARIMA(2,2,3)(0,0,0)[0] intercept   : AIC=2157.000, Time=0.58 sec
 ARIMA(3,2,0)(0,0,0)[0] intercept   : AIC=2192.307, Time=0.18 sec
 ARIMA(3,2,1)(0,0,0)[0] intercept   : AIC=2177.576, Time=0.53 sec
 ARIMA(3,2,2)(0,0,0)[0] intercept   : AIC=2177.948, Time=0.64 sec
Total fit time: 4.684 seconds
Out[88]:
ARIMA(order=(2, 2, 3), scoring_args={}, suppress_warnings=True)
In [89]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [90]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Recuperados"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  532.5402016179694
In [91]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de entrenamiento para casos recuperados"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Recuperados"],
                    mode='lines+markers',name="Datos de validación para datos recuperados",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos recuperados",))
fig.update_layout(title="Predicción de casos recuperados con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_Recuperados",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [92]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [93]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Recuperados","Predicción Modelo ARIMA"]).head()
Out[93]:
Recuperados Predicción Modelo ARIMA
0 2020-09-06 40254.007819
1 2020-09-07 41131.327941
2 2020-09-08 41989.346160
3 2020-09-09 42873.234936
4 2020-09-10 43743.078134

Modelo Prophet

In [94]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Recuperados"])),columns=['ds','y'])
In [95]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[95]:
<fbprophet.forecaster.Prophet at 0x1fd3d6e34c8>
In [96]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [97]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [98]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Recuperados"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  515.9664675989727
In [99]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [100]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)

CASOS ACTIVOS

Modelo ARIMA (Usando Auto-ARIMA)

In [103]:
model_train=df_Nuevo.iloc[:int(df_Nuevo.shape[0]*0.96)]
valid=df_Nuevo.iloc[int(df_Nuevo.shape[0]*0.96):]
y_pred=valid.copy()
In [104]:
model_arima= auto_arima(model_train["Acum_Activos"],trace=True, error_action='ignore', start_p=1,start_q=1,max_p=3,max_q=3,
                   suppress_warnings=True,stepwise=False,seasonal=False)
model_arima.fit(model_train["Acum_Activos"])
 ARIMA(0,1,0)(0,0,0)[0] intercept   : AIC=2587.863, Time=0.02 sec
 ARIMA(0,1,1)(0,0,0)[0] intercept   : AIC=2496.166, Time=0.14 sec
 ARIMA(0,1,2)(0,0,0)[0] intercept   : AIC=2436.260, Time=0.30 sec
 ARIMA(0,1,3)(0,0,0)[0] intercept   : AIC=2394.805, Time=0.55 sec
 ARIMA(1,1,0)(0,0,0)[0] intercept   : AIC=2369.144, Time=0.08 sec
 ARIMA(1,1,1)(0,0,0)[0] intercept   : AIC=2331.930, Time=0.25 sec
 ARIMA(1,1,2)(0,0,0)[0] intercept   : AIC=2332.756, Time=0.33 sec
 ARIMA(1,1,3)(0,0,0)[0] intercept   : AIC=2334.503, Time=0.44 sec
 ARIMA(2,1,0)(0,0,0)[0] intercept   : AIC=2334.715, Time=0.16 sec
 ARIMA(2,1,1)(0,0,0)[0] intercept   : AIC=2332.547, Time=0.36 sec
 ARIMA(2,1,2)(0,0,0)[0] intercept   : AIC=2326.796, Time=0.53 sec
 ARIMA(2,1,3)(0,0,0)[0] intercept   : AIC=2328.561, Time=0.46 sec
 ARIMA(3,1,0)(0,0,0)[0] intercept   : AIC=2334.214, Time=0.24 sec
 ARIMA(3,1,1)(0,0,0)[0] intercept   : AIC=2334.299, Time=0.52 sec
 ARIMA(3,1,2)(0,0,0)[0] intercept   : AIC=2328.645, Time=0.49 sec
Total fit time: 4.879 seconds
Out[104]:
ARIMA(order=(2, 1, 2), scoring_args={}, suppress_warnings=True)
In [105]:
prediction_arima=model_arima.predict(len(valid))
y_pred["ARIMA Model Prediction"]=prediction_arima
In [106]:
model_scores.append(np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
print("Error Cuadrático Medio Modelo ARIMA: ",np.sqrt(mean_squared_error(valid["Acum_Activos"],prediction_arima)))
Error Cuadrático Medio Modelo ARIMA:  1519.3415822326465
In [107]:
fig=go.Figure()
fig.add_trace(go.Scatter(x=model_train.index, y=model_train["Acum_Activos"],
                    mode='lines+markers',name="Datos de entrenamiento para casos activos"))
fig.add_trace(go.Scatter(x=valid.index, y=valid["Acum_Activos"],
                    mode='lines+markers',name="Datos de validación para datos activos",))
fig.add_trace(go.Scatter(x=valid.index, y=y_pred["ARIMA Model Prediction"],
                    mode='lines+markers',name="Predicción de casos activos",))
fig.update_layout(title="Predicción de casos activos con el modelo ARIMA de Medellín",
                 xaxis_title="Fecha",yaxis_title="Acum_muertos",legend=dict(x=0,y=1,traceorder="normal"))
fig.show()
In [108]:
ARIMA_model_new_prediction=[]
for i in range(1,18):
    ARIMA_model_new_prediction.append(model_arima.predict(len(valid)+i)[-1])
In [109]:
pd.DataFrame(zip(new_date,ARIMA_model_new_prediction),columns=["Activos","Predicción Modelo ARIMA"]).head()
Out[109]:
Activos Predicción Modelo ARIMA
0 2020-09-06 12017.538460
1 2020-09-07 11721.760261
2 2020-09-08 11316.341631
3 2020-09-09 11039.304057
4 2020-09-10 10657.644578

Modelo Prophet

In [110]:
prophet_c=Prophet(interval_width=0.75,weekly_seasonality=True,)
prophet_confirmed=pd.DataFrame(zip(list(df_Nuevo.index),list(df_Nuevo["Acum_Activos"])),columns=['ds','y'])
In [111]:
prophet_c.fit(prophet_confirmed)
INFO:fbprophet:Disabling yearly seasonality. Run prophet with yearly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Out[111]:
<fbprophet.forecaster.Prophet at 0x1fd3cd29448>
In [112]:
forecast_c=prophet_c.make_future_dataframe(periods=17)
forecast_confirmed=forecast_c.copy()
In [113]:
confirmed_forecast=prophet_c.predict(forecast_c)
In [114]:
model_scores.append(np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
print("Error Cuadrático Medio Modelo Prophet: ",np.sqrt(mean_squared_error(df_Nuevo["Acum_Activos"],confirmed_forecast['yhat'].head(df_Nuevo.shape[0]))))
Error Cuadrático Medio Modelo Prophet:  3788.048697525075
In [115]:
print(prophet_c.plot(confirmed_forecast))
Figure(720x432)
In [116]:
print(prophet_c.plot_components(confirmed_forecast))
Figure(648x432)